// 版权所有2009 Go作者。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package gob

import "fmt"

// 解码和编码中的错误使用panic和recover进行处理。
// 由用户错误引起的恐慌（即，除运行时恐慌之外的所有恐慌
// 例如“索引超出界限”错误）不会离开导致
// 的文件，而是会转化为纯错误返回。编码和
// 解码不返回错误的函数和方法可以使用
// 报告错误，或者保证无错误。

// gobError用于区分此包中生成的错误（恐慌）。
type gobError struct {
	err error
}

// errorf类似于error_uu，但使用Printf样式的参数来构造错误。
// 它总是在消息的前面加上“gob:”。
func errorf(format string, args ...any) {
	error_(fmt.Errorf("gob: "+format, args...))
}

// error包装参数error，并将其用作参数来恐慌。
func error_(err error) {
	panic(gobError{err})
}

// catchError是一个延迟函数，用于将恐慌（gobError）转化为
// 普通错误。它覆盖延迟调用的函数的错误返回。
func catchError(err *error) {
	if e := recover(); e != nil {
		ge, ok := e.(gobError)
		if !ok {
			panic(e)
		}
		*err = ge.err
	}
}
